// cf-489e
// 题意：给定一维坐标从左到右大于零的n(<=1000)个景点，初始在坐标原点。
//       每个经典有个欣赏价值b[i]。每一天你可以从初始点或者一个景点
//       往右到任意一个景点（可以跳过一些），最终在最右边的景点结束。
//       但是你计划每天旅游l距离，所以如果你在某一天实际走了d距离，
//       你会获得sqrt(|l-d|)的烦扰值，现在要求一种安排，使得
//         sigma(烦恼值)/sigma(欣赏价值) 最小，并输出一种方案。
//
// 题解：先二分答案k，然后把分母乘过去减到分子上，做一个dp设f[i]表示
//       做到前i个景点以i结束，sigma(烦恼值-k*b[i])的最小值，最后看
//       f[n]是不是小于等于零，如果是说明答案还可以小。
//       输出方案只要在转移的时候记录一下就行。
//
// run: $exec < input
#include <iostream>
#include <stack>
#include <algorithm>
#include <cmath>

struct data { int x, b; };

int const  inf = 1 << 30;
int const maxn = 1007;
double f[maxn];
int from[maxn];
data da[maxn];
int n, l;

bool judge(double m)
{
	std::fill(f, f + n + 1, inf);
	f[0] = 0;
	for (int i = 1; i <= n; i++)
		for (int j = 0; j < i; j++) {
			auto dis = da[i].x - da[j].x;
			if (f[i] > f[j] + std::sqrt(std::abs(l - dis)) - m * da[i].b) {
				f[i] = f[j] + std::sqrt(std::abs(l - dis)) - m * da[i].b;
				from[i] = j;
			}
		}
	return f[n] <= 0;
}

void print()
{
	std::stack<int> s;
	for (int i = n; i; i = from[i])
		s.push(i);
	for (; !s.empty(); s.pop()) std::cout << s.top() << ' ';
	std::cout << '\n';
}

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin >> n >> l;
	for (int i = 1; i <= n; i++) std::cin >> da[i].x >> da[i].b;
	double l = 0, r = 2000;
	for (int i = 0; i <= 200; i++) {
		double mid = (l + r) / 2.0;
		if (judge(mid)) r = mid;
		else l = mid;
	}
//	std::cout << r << '\n';
	print();
}

